public class SquareSolution{
    public static void main(String[] args) {
        SquareSolution solution = new SquareSolution();
        int[][] result = solution.generateMatrix(7);

        for (int[] row : result) {
            for (int num : row) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
    }

    public int[][] generateMatrix(int n) {
        //int x,y; //操作指针-关于局部和全局问题
        int setI=0;int setJ=0;//起始|参照点
        int lengthReduce = 1; //控制当前圈的条长度
        int count=0; //计数器
        int rounds=n/2; //总圈数
        int[][] nums = new int[n][n];
        int I=0;int J=0;
        while(rounds > 0){

            //出发
            //1一条的长度[由于两边都会画边 所以下一轮长度少了两=xy往右1+长度控制器1]控制
            //2-此处和随想录二分法关联性没搞懂-就是迭代的长度 如何指针控制迭代和控制迭代
            //3xy的区分
            for (J=setJ; J<n-lengthReduce; J++){
                count++;
                //nums[I]这里会回到起点[J] = count; //不需要思考传递，因为xy是for局部外的相对全局 在()赋值会失效到相对全局的int x,y上
                nums[setI][J] = count;
            }
            for(I=setI; I<n-lengthReduce;I++){
                count++;
                nums[I][J] = count;
            }
            //回归
            for(; J >setJ;J--){
                count++;
                nums[I][J] = count;
            }
            for(; I >setI;I--){
                count++;
                nums[I][J] = count;
            }
            setI++;
            setJ++;
            lengthReduce++;
            rounds--;
        }

        if (n % 2 == 1) { // n 为奇数时，单独处理矩阵中心的值
            count++;
            nums[setI][setJ] = count;
        }
        return nums;
    }
}

